package main

import (
	"fmt"
	"go-bluebell/initialize"
	"go-bluebell/router"
	"go-bluebell/utils"

	"github.com/spf13/viper"

	"go.uber.org/zap"
)

// Go Web 开发较为通用的脚手架
// https://github.com/go-playground/validator#hdr-Baked_In_Validators_and_Tags

func main() {
	// 1. 加载配置文件
	err := initialize.SettingInit()
	if err != nil {
		fmt.Printf("配置文件加载失败，错误原因是：%v\n", err)
		return
	}

	// 2. 初始化日志
	err = initialize.LoggerInit()
	if err != nil {
		fmt.Printf("日志加载失败，错误原因是：%v\n", err)
		return
	}
	defer zap.L().Sync()

	// 3. 初始化 MySQL 连接
	err = initialize.MySQLInit()
	if err != nil {
		fmt.Printf("MySQL加载失败，错误原因是：%v\n", err)
		return
	}

	// 4. 初始化 Redis 连接
	err = initialize.RedisInit()
	if err != nil {
		fmt.Printf("Redis加载失败，错误原因是：%v\n", err)
		return
	}
	defer initialize.RedisClose()

	// 4.5. 初始化雪花算法（雪花算法生成分布式ID）
	err = utils.SnowFlakeInit(viper.GetString("app.start_time"), viper.GetInt64("app.machine_id"))
	if err != nil {
		fmt.Printf("雪花算法加载失败，错误原因是：%v\n", err)
		return
	}

	// 5. 注册路由
	r := router.Setup()

	// 6. 启动服务（优雅关机）
	initialize.SafetyShutdown(r)

}
